//TODO Concurrencia hibernate (cache)
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fisica;

import hibernate.Sesion;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import presentacion.utilidad.Paginador;

/**
 *
 * @author Administrador
 */
public class CapaFisica {

    /**
     * Persiste o actualiza el objeto en la base de datos.
     *
     * @param unObjeto Objeto a persistir
     * @return true si agregó/modificó correctamente, false en caso contrario
     * @throws HibernateException Excepción de Hibernate
     */
    public static boolean guardarOActualizarObjeto(Object unObjeto)
            throws HibernateException {
        try {
            Sesion.sesion.beginTransaction();
            Sesion.sesion.saveOrUpdate(unObjeto);
            Sesion.sesion.getTransaction().commit();
            return true;
        } catch (HibernateException he) {
            System.err.println(he.getMessage());
            return false;
        }
    }

    /**
     * Elimina el objeto de la base de datos.
     *
     * @param unObjeto Objeto a eliminar
     * @return true si eliminó correctamente, false en caso contrario
     * @throws HibernateException Excepción de Hibernate
     */
    public static boolean eliminarObjeto(Object unObjeto)
            throws HibernateException {
        try {
            Sesion.sesion.beginTransaction();
            Sesion.sesion.delete(unObjeto);
            Sesion.sesion.getTransaction().commit();
            return true;
        } catch (HibernateException he) {
            System.err.println(he.getMessage());
            return false;
        }
    }

    /**
     * Retorna todos los objetos del objeto pasado por parámetro.
     *
     * @param objeto La clase de la cual se desean obtener todos los objetos
     * @param orderBy El String que proporciona la posibilidad de ordenar. Si es
     * nulo no se ordena por ningún criterio
     * @return Todos los objetos que estén en la base de datos
     */
    public static Vector getAll(String objeto, String orderBy)
            throws HibernateException {
        Sesion.sesion.beginTransaction();
        Query q;
        
        if (orderBy != null) {
            q = Sesion.sesion.createQuery("from " + objeto + " " + orderBy);
            Paginador.paginar(q);
        } else {
            q = Sesion.sesion.createQuery("from " + objeto);
        }

        List<Object> listaConsulta = q.list();

        if (!listaConsulta.isEmpty()) {
            // Convierte la lista a vector
            Vector<Object> vectorConsulta = listaAVector(listaConsulta);
            Sesion.sesion.getTransaction().commit();

            // Devuleve los objetos consultados
            return vectorConsulta;
        }

        Sesion.sesion.getTransaction().commit();
        return null;
    }


    /**
     * Elimina los objetos pasados por parámetro.
     *
     * @return true si eliminaron correctamente, false en caso contrario
     * @throws HibernateException Excepción de Hibernate
     */
    public static boolean deleteAll(Vector listaDeObjetos)
            throws HibernateException {
        try {
            Sesion.sesion.beginTransaction();
            for (int i = 0; i < listaDeObjetos.size(); i++) {
                Sesion.sesion.delete(listaDeObjetos.get(i));
            }
            Sesion.sesion.getTransaction().commit();
            return true;
        } catch (HibernateException he) {
            System.err.println(he.getMessage());
            return false;
        }
    }

    /**
     * Retorna el vector de objetos consultados.
     *
     * @param q La consulta para efectuar en la base de datos
     * @return El vector de objetos resultado, null si no existe
     */
    public static Vector getVectorObjetos(Query q)
            throws HibernateException {;
        Sesion.sesion.beginTransaction();
        List<Object> listaConsulta = q.list();
        Sesion.sesion.getTransaction().commit();


        //Si la consulta arroja resultados, los retorna
        if (!listaConsulta.isEmpty()) {
            //Convierte la lista a vector y la retorna
            return listaAVector(listaConsulta);
        }

        //De lo contrario, se retorna null
        return null;
    }

    /**
     * Retorna el objetos consultado.
     *
     * @param q La consulta para efectuar en la base de datos
     * @return El objeto resultado, null si no existe
     */
    public static Object getObjeto(Query q)
            throws HibernateException {
        Sesion.sesion.beginTransaction();
        List<Object> listaConsulta = q.list();        
        Sesion.sesion.getTransaction().commit();

        //Si la consulta arroja resultados, los retorna
        if (!listaConsulta.isEmpty()) {
            //Retorna el objeto consultados
            return listaConsulta.get(0);
        }

        //De lo contrario, se retorna null
        return null;
    }

    /**
     * Convierte una lista a vector.
     *
     * @param unaLista Lista para ser convertida
     * @return Vector resultante
     */
    public static Vector listaAVector(List unaLista) {
        Vector vectorResultado = new Vector();
        Iterator iter = unaLista.iterator();

        while (iter.hasNext()){
            vectorResultado.add(iter.next());
        }

        return vectorResultado;
    }
    
}
